#include "Mapa.h"

void Mapa::Cargar(const char* filename)
{
	fstream f;
	f.open(filename);
	
	int alto, ancho;
	f >> ancho >> alto;
	dimensiones = Dimensiones_t(ancho,alto);

	mapa = new Uint*[dimensiones.Alto()];
	ocupado = new bool*[dimensiones.Alto()];
	forn(i,dimensiones.Alto())
	{
		mapa[i] = new Uint[dimensiones.Ancho()];
		ocupado[i] = new bool[dimensiones.Ancho()];
		forn(j,dimensiones.Ancho())
		{
			char c; f >> c;
			mapa[i][j] = atoi(&c);
			ocupado[i][j] = tileset.EsCaminable(mapa[i][j]) ? false : true;
		}
	}
	
	f.close();
}

// no es const porque Tileset::Tile() no lo es
// TODO: Hacer que tome un Punto
SDL_Surface* Mapa::VistaDeTile(const int i, const int j)
{
	Validar(Punto(j,i)); // DEBUG?
	return tileset.VistaDeTile( mapa[i][j] );
}

bool Mapa::EsCaminable(const Punto& posicion) const
{
	return EsValida(posicion) &&  tileset.EsCaminable( mapa[posicion.Y()][posicion.X()] );
}

const Dimensiones_t& Mapa::Dimensiones() const	{ return dimensiones; }

void Mapa::Ocupar(const Punto& posicion)
{
	Validar(posicion);
	assert(PuedoOcupar(posicion));
	ocupado[posicion.Y()][posicion.X()]=true;
}

bool Mapa::Desocupar(const Punto& posicion)
{
	Validar(posicion);
	assert(!PuedoOcupar(posicion));
	ocupado[posicion.Y()][posicion.X()]=false;
}

bool Mapa::PuedoOcupar(const Punto& posicion)
{
	Validar(posicion);
	return ocupado[posicion.Y()][posicion.X()]==false;
}

bool Mapa::EsValida(const Punto& posicion) const
{
	return 0<= posicion.X() && posicion.X() < dimensiones.Ancho() && 0<= posicion.Y() && posicion.Y() < dimensiones.Alto();
}

void Mapa::Validar(const Punto& posicion) const
{
	if(!EsValida(posicion))
	{
		cout << "Posicion no valida: " << posicion << endl;
		exit(1);
	}
}
